﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace Scope8
{
    /// <summary>
    /// Diese Klasse repräsentiert einen Imageserver der Slides liefern kann. Ein Imageserver kann ein web-Server sein, der mit einer REST-Schnittstelle ausgestattet ist.
    /// </summary>
    class ImageServer
    {
        /// <summary>
        /// die Slides, die auf dem server zur Verfügung stehen.
        /// </summary>
        private List<Slide> _avaibleSlides = new List<Slide>();

        /// <summary>
        /// die Server URL des Servers
        /// </summary>
        private String _serverURL = string.Empty;

        /// <summary>
        /// Listen von Listen von Slides. 
        /// </summary>
        public static List<List<Slide>> StaticAvaibleSlides = new List<List<Slide>>();

        /// <summary>
        /// Standardkonstruktor
        /// </summary>
        public ImageServer()
        {
        }

        /// <summary>
        /// Fügt eine Liste von Slides zu der statischen Liste hinzu. 
        /// </summary>
        /// <param name="listOfslides">die Liste von Slides</param>
        public void addToStaticList(List<Slide> listOfslides)
        {
            StaticAvaibleSlides.Add(listOfslides);
        }
        
        /// <summary>
        /// Setzt die URL des Servers 
        /// </summary>
        /// <param name="newURL">die neue URL des Servers</param>
        public void setURL(String newURL)
        {
            _serverURL = newURL;
        }

        /// <summary>
        /// Fügt die lokale Liste des Servers zu der statischen Lite hinzu
        /// </summary>
        public void addToStaticList()
        {        
            StaticAvaibleSlides.Add(_avaibleSlides);
        }

        /// <summary>
        /// die ServerURl des Servers
        /// </summary>
        public String ServerURL
        {
            get { return _serverURL; }
            set { _serverURL = value; }
        }

        /// <summary>
        /// Liefert die lokalen verfügbaren Slides des Servers. Methode ist als virtual deklariert, da diese von den Klassen, die davon erben, überschreieben werden soll.
        /// </summary>
        /// <returns>die lokal verfügbaren Slides</returns>
        public virtual async Task<List<Slide>> getAvaiableSlides()
        {
            return AvaibleSlides;
        }

        /// <summary>
        /// Fügt die Slides einer Liste zu der lokalen Liste hinzu.
        /// </summary>
        /// <param name="list">die Slides in einer Liste, die zu der loklen Liste hinzugefügt werden soll.</param>
        public void AddToAvaibleSlideList(List<Slide> list)
        {
            foreach (Slide anEntry in list)
            {
                AvaibleSlides.Add(anEntry);
            }
        }

        /// <summary>
        /// Liefert den XmlReader der angegebenen ServerURL
        /// </summary>
        /// <returns>der XmlReader</returns>
        protected async Task<XmlReader> getXmlReader()
        {
            return await getXmlReader(_serverURL);
        }

        /// <summary>
        /// Liefert zu der angegebenen URL den XmlReader.
        /// </summary>
        /// <param name="url">die Url zu einer Xml Datei.</param>
        /// <returns>den XmlReader zu einer validen Xml-Datei</returns>
        protected async Task<XmlReader> getXmlReader(String url)
        {
            Uri uri = new Uri(String.Format(url));
            WebRequest request = WebRequest.Create(uri);

            WebResponse response = await request.GetResponseAsync();

            Stream inputStream = response.GetResponseStream();
            XmlReader reader = XmlReader.Create(inputStream);
            return reader;
        }

        /// <summary>
        /// Liefert die lokale Liste von Slides zurück bzw. legt diese fest.
        /// </summary>
        internal List<Slide> AvaibleSlides
        {
            get { return _avaibleSlides; }
            set { _avaibleSlides = value; }
        }
    }
}
